package cn.le.thread;

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.concurrent.*;

/**
 * 从任务中生成返回值
 */
public class TaskWithResult implements Callable<String> {

    private int id;
    public TaskWithResult(int id)
    {
        this.id = id;
    }

    public String call()
    {
        return "result of TaskWithResult "+id;
    }
}
class CallableDemo{

    public static void main(String[] args) {

        ExecutorService exec = Executors.newCachedThreadPool();
        ArrayList<Future<String>> results = new ArrayList<>();

        for (int i = 0; i < 10; i++)
        {
            //提交一个返回值的任务用于执行，返回一个表示任务的未决结果的 Future。
            results.add(exec.submit(new TaskWithResult(i)));
        }

        for (Future<String> fs : results)
        {
            try {
                //使用get时,如果Future未完成时,将阻塞,可以用isDone()来检测是否完成,使用get()当前主线程会阻塞
                System.out.println(fs.get());
            }catch (InterruptedException e)
            {
                e.printStackTrace();
                return;
            }catch (ExecutionException e)
            {
                e.printStackTrace();
            }finally {
                exec.shutdown();
            }
        }
    }

}














